import { bindSocialUser } from '@/api/interface.js'

/**
 * 订阅消息工具函数
 */

// 订阅消息类型常量
export const SUBSCRIBE_TYPES = {
  UNREAD_NOTICE: 'unreadNotice',
  APPROVAL_PROGRESS: 'approvalProgress'
};

// 默认的订阅消息配置（实际应用中应该从服务器获取）
const DEFAULT_TEMPLATES = {
  [SUBSCRIBE_TYPES.UNREAD_NOTICE]: {
    templateId: '9yjsEEOp2gnaWJTR6MqhonTNrrK88GFEhMnvUEx6h4s', // 未读消息提醒模板ID
    title: '未读消息提醒',
    description: '您有新的未读消息，请及时查看'
  },
  [SUBSCRIBE_TYPES.APPROVAL_PROGRESS]: {
    templateId: 'JNfZ9hgoxm6-y2UVFiiJ0FJYBYH3nSGPGFS_PsAtwwk', // 审批进度通知模板ID
    title: '审批进度通知',
    description: '您的审批申请有新的进展，请及时查看'
  }
};

/**
 * 请求订阅消息权限
 * @param {Array} types - 订阅消息类型数组
 * @returns {Promise} - 返回订阅结果
 */
export const requestSubscribe = (types = []) => {
  return new Promise((resolve, reject) => {
    // 检查用户登录状态
    const userInfo = uni.getStorageSync('userInfo') || {};
    
    // 如果用户未登录（isLogin为false），先进行授权登录并绑定
    if (userInfo.isLogin === false) {
      // 先调用uni.login获取code
      uni.login({
        provider: 'weixin',
        success: (loginRes) => {
          if (loginRes.code) {
            // 生成state参数（简单实现，实际应用中可能需要更复杂的生成方式）
            const state = 'wx_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
            
            // 调用社交绑定接口
            bindSocialUser({
              type: 34, // 写死为34
              code: loginRes.code,
              state: state
            }).then(bindRes => {
              console.log('社交绑定成功:', bindRes);
              // 更新用户信息，设置为已登录
              userInfo.isLogin = true;
              uni.setStorageSync('userInfo', userInfo);
              
              // 绑定成功后继续请求订阅消息
              processSubscribeRequest(types, resolve, reject);
            }).catch(bindErr => {
              console.error('社交绑定失败:', bindErr);
              reject(new Error('授权登录失败，请稍后重试'));
            });
          } else {
            console.error('获取登录code失败:', loginRes);
            reject(new Error('获取登录凭证失败，请稍后重试'));
          }
        },
        fail: (loginErr) => {
          console.error('登录失败:', loginErr);
          reject(new Error('登录失败，请稍后重试'));
        }
      });
    } else {
      // 用户已登录，直接请求订阅消息
      processSubscribeRequest(types, resolve, reject);
    }
  });
};

/**
 * 处理订阅消息请求
 * @param {Array} types - 订阅消息类型数组
 * @param {Function} resolve - Promise resolve函数
 * @param {Function} reject - Promise reject函数
 */
function processSubscribeRequest(types, resolve, reject) {
  // 获取模板ID列表
  const tmplIds = getTemplateIdsByTypes(types);
  
  if (tmplIds.length === 0) {
    console.log('没有有效的订阅消息模板');
    resolve({});
    return;
  }
  
  // 请求订阅
  uni.requestSubscribeMessage({
    tmplIds,
    success: (res) => {
      console.log('订阅消息请求结果:', res);
      // 保存订阅状态
      saveSubscribeStatus(res);
      
      // 检查是否有任何模板被接受订阅
      let hasAccepted = false;
      for (const templateId in res) {
        if (res[templateId] === 'accept') {
          hasAccepted = true;
          break;
        }
      }
      
      // 当订阅成功时，提示用户下一步操作
      // 这里模拟返回{"code":0,"msg":"","data":true}的情况
      // 实际应用中，这个逻辑应该根据服务器返回的真实数据来判断
      if (hasAccepted) {
        // 显示授权成功提示，引导用户下一步操作
        uni.showToast({
          title: '授权成功，您将收到相关消息通知',
          icon: 'success',
          duration: 2000
        });
        
        // 可以在这里添加后续操作的提示或引导
        setTimeout(() => {
          console.log('引导用户进行下一步操作');
        }, 2000);
      }
      
      resolve(res);
    },
    fail: (err) => {
      console.error('订阅消息请求失败:', err);
      reject(err);
    }
  });
}

/**
 * 根据类型获取模板ID列表
 * @param {Array} types - 订阅消息类型数组
 * @returns {Array} - 模板ID列表
 */
function getTemplateIdsByTypes(types) {
  const tmplIds = [];
  
  types.forEach(type => {
    const template = DEFAULT_TEMPLATES[type];
    if (template && template.templateId) {
      tmplIds.push(template.templateId);
    }
  });
  
  return tmplIds;
}

/**
 * 保存订阅状态
 * @param {Object} subscribeResult - 订阅结果对象
 */
export function saveSubscribeStatus(subscribeResult) {
  const subscribeStatus = uni.getStorageSync('subscribeStatus') || {};
  
  for (const templateId in subscribeResult) {
    subscribeStatus[templateId] = {
      isSubscribed: subscribeResult[templateId] === 'accept',
      time: Date.now()
    };
  }
  
  uni.setStorageSync('subscribeStatus', subscribeStatus);
}

/**
 * 获取订阅状态
 * @param {String} templateId - 模板ID
 * @returns {Object} - 订阅状态对象
 */
export function getSubscribeStatus(templateId) {
  const subscribeStatus = uni.getStorageSync('subscribeStatus') || {};
  return subscribeStatus[templateId] || { isSubscribed: false, time: 0 };
}

/**
 * 检查是否需要重新请求订阅
 * @param {String} templateId - 模板ID
 * @returns {Boolean} - 是否需要重新请求
 */
export function needReRequestSubscribe(templateId) {
  const status = getSubscribeStatus(templateId);
  const now = Date.now();
  // 如果未订阅或者订阅时间超过24小时，则需要重新请求
  return !status.isSubscribed || (now - status.time > 24 * 60 * 60 * 1000);
}

/**
 * 在适当的时机提示用户开启订阅
 * @param {String} type - 订阅类型
 */
export function promptUserToSubscribe(type) {
  const template = DEFAULT_TEMPLATES[type];
  if (!template) return;
  
  // 检查是否需要重新请求
  if (needReRequestSubscribe(template.templateId)) {
    uni.showModal({
      title: '消息订阅提醒',
      content: `是否允许接收${template.description}？`,
      success: (res) => {
        if (res.confirm) {
          requestSubscribe([type]);
        }
      }
    });
  }
}